阅读更多

0顶
0踩

研发管理
引言

(图片来自:http://t.cn/R06rQHi

很多人看到这个标题时,都会想“你都100%代码覆盖了,怎么还会有问题呢?” 让我们看一下代码例子:
public class TestCalculator {

       public Double add(Double a, Double b) {

              return a + b;}

}

再看看用junit写出的测试代码:
@Test
public void testAdd() {

       Double a = new Double(1);

       Double b = new Double(2);

       Double c = new Double(3);

       assertEquals(c, testCalculator.add(a, b));

}

当我们使用EclEmma或者Jacoco来进行覆盖测试时,对于这个类,我们将得到100%测试覆盖率。

一切看起来都那么的完美,真是这样的吗?

好吧,让我们来来看看另一个测试,当其中一个变量为null时,返回值将会是什么?
@Test
public void testAddNullPointerException() {

       Double a = new Double(1);

       Double b = null;

       Double c = new Double(3);

       assertEquals(c, testCalculator.add(a, b));

}

好了,你会发现尽管覆盖率为100%,但程序却抛出了NullPointerException。

那么肯定有人会问,这样的话单元测试覆盖率的高低都不能作为衡量项目代码质量的指标,那么我们要单元测试还有什么用?

首先,我想我们可能搞错了测试覆盖的定义。

我们先听听Martin Fowler对于测试覆盖的定义
引用
Test coverage is a useful tool for finding untested parts of a codebase. Test coverage is of little use as a numeric statement of how good your tests are.



他认为:把测试覆盖作为质量目标没有任何意义,我们应该把它作为一种发现未被测试覆盖的代码的手段。

所以100%的代码覆盖率还值得追求吗?

当然,这应该是每个程序员毕生的追求之一,但是如果从项目角度考虑ROI(投入产出比),对于需要快速上线的短期项目,需要注重的是让测试覆盖核心功能代码。如果你的项目是一个长期项目,那么高覆盖率是非常有必要的,它意味着高可维护性,以及更少的bug。(前提是你的测试采用TDD/BDD方式编写,我见过将测试代码写的一团糟的人,看着他的代码,我宁愿重新写一遍)

那么对于一个项目来说,覆盖率应该达到多少?

其实没有适用于所有项目的数值,每个项目都应有自己的阈值,但共性是,测试必须覆盖主要业务场景,代码的逻辑分支也必须尽可能的覆盖。

如何改进你的项目代码覆盖率?

首先我们要阅读和理解项目代码,找出其中需要测试并且与业务强相关的代码,结合sonar等代码质量管理平台,从代码编写规范、复杂度、重复代码等方面进行代码重构,进一步提高项目的可维护性与可读性。

这也意味着重构,重构的同时,你需要更多的测试来保证你重构代码的正确性。

其次要对code coverage进行度量分析,那么我们应该怎么度量code coverage?

一般来说我们从以下四个维度来度量,如上图所示:
  • 行覆盖率(line coverage):度量被测代码中每个可执行语句是否都被执行到,但不包括java import,空行,注释等。
  • 函数覆盖率(function coverage):度量被测代码中每个定义的函数是否都被调用。
  • 分支覆盖率(branch coverage):度量被测代码中每一个判定的分支是否都被测试到。
  • 语句覆盖率(statement coverage):度量被测代码是否每个语句都被执行。
所以行覆盖率的高低不能说明项目的好坏,我们要从多方面进行思考,一般我们遵循的标准应是:函数覆盖率 > 分支覆盖率 > 语句覆盖率

代码覆盖率最重要的意义在于:

  • 阅读分析之前项目中未覆盖部分的代码,进而反推在前期QA以及相关测试人员在进行黑盒测试设计时是否考虑充分,没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?是需求或者UX设计不够清晰,还是测试设计的理解有误。
  • 检测出程序中的废代码,可以逆向反推代码设计中不合理的地方,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
  • 代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量绝对不会高到哪里去,可以作为测试自我审视的重要工具之一。
结束语

单元测试的覆盖率并不只是为了取悦客户或者管理层的数据,它能够实实在在反应项目中代码的健康程度,帮助我们更好的改善了代码的质量,增加了我们对所编写代码的信心。
  • 大小: 18.6 KB
  • 大小: 71.1 KB
  • 大小: 275.4 KB
  • 大小: 97.8 KB
  • 大小: 149.9 KB
来自: 齐磊
0
0
评论 共 2 条 请登录后发表评论
2 楼 华家小谁 2017-10-04 02:52
确实,单元测试不等于 100% 无bug

不然测试团队干啥。

源码解析 http://www.iocoder.cn?iteye
1 楼 lixuejian 2017-09-29 16:00
6666666

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • koverage:Kotlin的100%代码覆盖率

    Kotlin数据类和其他生成的kotlin代码的100%代码覆盖率。 这是一个已知的问题,Kotlin会在后台生成大量代码,并且标准的覆盖技术无法应对这些路径。 该库是一种蛮力解决方案,可以在测试时强制遍历这些路径,从而...

  • 分支覆盖率 代码覆盖率_报告100%的代码覆盖率是否合理?

    分支覆盖率 代码覆盖率 公共代码基金会致力于为国际公共组织(例如地方政府)启用开放和协作的公共目的软件。 为此,我们通过代码库管理在代码库级别支持软件。 我们还发布了公共代码标准 (在撰写本文时,其草稿...

  • 分支覆盖率 代码覆盖率_100%的代码覆盖率!

    @unclebobmartin 100%的代码覆盖率无济于事,可以使您更安全,而事实并非如此。 @nicolas_frankel 100%的代码覆盖率不是成就,而是最低要求。 如果编写一行代码,则最好对其进行测试。 ...

  • 软件分支测试覆盖率 100%,测试覆盖率之三——测试覆盖率100%相关的话题

    如果有兴趣的话,可以阅读测试覆盖率之二——测试覆盖率有什么用?关于测试覆盖率,我个人的感觉是说的多,用的少。最近在网络上看到一篇文章,讨论一个问题“测试需要100%的覆盖率吗?”被转载了很多次,有兴趣的...

  • 软件测试之测试覆盖率,软件测试之需要100%的测试覆盖率吗?

    有人会告诉你要做到100%的测试覆盖率。另一些人却不这么想,他们认为这个问题的答案因测试代码 质量 的不同而不同,而衡量测试覆盖率并不能说明这些测试及被测试代码的质量。 来自ObjectMentor的Tim Ottinger写道:...

  • html代码width什么意思,width:100% 啥意思呢,在什么情况下使用?

    width:100% 啥意思呢,在什么情况下使用?很少用到这个,不怎么了解。。有例子可以参考下么?作者: kangyuan发布时间: 2009-10-16至少做规则覆盖的时候会用到吧作者: ivershuo发布时间: 2009-10-16嗯,有时候用它来...

  • 覆盖率验证——代码覆盖率+功能覆盖率

    文章目录一、基于覆盖率驱动的验证技术二、代码覆盖率功能覆盖率三、功能覆盖率建模3.1.功能覆盖率模型——covergroup3.2.覆盖点——coverpoint3.3.覆盖点的——bins四、代码code 一、基于覆盖率驱动的验证技术 采用...

  • 还在担心漏测吗?快来使用jacoco统计下代码覆盖率

    一般都需要借助工具来统计单元测试用例覆盖了多少业务代码、算法代码,覆盖率高的情况下,比如覆盖率达到70%,交付给功能测试、接口测试、性能测试人员前代码的质量相对高很多,java代码一般可借助统计覆盖率的工具...

  • 100%代码覆盖率的悲剧

    原文:http://labs.ig.com/code-coverage-100-percent-tragedy 作者:Daniel Lebrero 翻译:Aladdin 本文Daniel Lebrero在大数据团队担任IG的技术架构师。拥有超过15年的Java经验和4年的Clojure经验,他现在是...

  • 100%的单元测试覆盖率是不够的

    代码覆盖率工具仅衡量测试是否执行代码; 他们对测试的有效性没有判断力。 测试人员应审查单元测试,即使它们具有较高的覆盖率,也可以帮助改进测试或在必要时补充额外的测试。 译文内容 当开发人员进行的单元...

  • 有必要追求 100% 的单测覆盖率吗?

    【编者按】本文主要讨论了一个项目的开发过程中对测试覆盖率的要求以及其带来的挑战,强调了 100% 的测试覆盖率的重要性和好处,尤其是在避免隐藏错误和减少回归问题方面的作用,在团队规模扩大时尤为重要。...

  • 代码覆盖率

    代码覆盖率是衡量验证进展的最简易的方式。它的作用是检查代码是否冗余,设计要点是否遍历,被检测的对象是RTL代码,而代码覆盖率的检测一般由工具自动生成的,不需要自定义收集条件。如果只是为了验证分支覆盖率,...

  • 【原创】代码覆盖率达到100%是否就算覆盖全了?不是的话,它的意义何在?

    在软件测试中,有一个重要的概念叫做代码覆盖率,一般在单元测试中作为测试充分性的重要衡量指标,那么代码覆盖率达到100%是否就算覆盖全了?答案显然是否定的,博客园中有篇博文《代码覆盖率浅谈》已经说明的很详细...

  • 小白练习跑覆盖率从0到100%

    字不对齐测试后,代码覆盖率增长比较快,主要是在这个case中首次将data的高16位赋值了,前面三个case的赋值主要在低16位...在重新跑完定向的激励后,导入之前exclude的文件,最后发现功能覆盖率和代码覆盖率均达到100%

  • 软件测试怎么做到需求全覆盖,为什么测试全覆盖很难?

    正面观点:100%的覆盖是可以的,为什么呢?看下面的代码:我们有这样的一个方法:public int getAccount(){return 999;}这样的方法走一次就可以了,你只要执行它(System.out.pringln(xxx.getAccount()))它就会乖乖的...

  • jacoco代码覆盖率

    jacoco代码覆盖率

  • 浅谈代码覆盖率

    经常有人问这样的问题:“我们在做单元测试,那测试覆盖率要到...  代码覆盖率的意义  分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?需求/设计

  • 软件测试单元测试80%,单元测试的代码覆盖率至少80%

    单元测试的代码覆盖率至少80%发表于:2013-04-12来源:酷勤网作者:不详点击数:标签:单元单元测试的代码覆盖率至少80%!一大早,一个年轻的程序员问大师: “我准备写一些单元测试用例。代码覆盖率应该达到多少为好...

  • 代码覆盖率和测试覆盖率_代码覆盖率与测试覆盖率; 哪个更好?

    代码覆盖率和测试覆盖率 测试覆盖率和代码覆盖... 这就是为什么我想到写一篇文章来详细讨论代码覆盖率和测试覆盖率之间的区别的原因。 代码覆盖率与测试覆盖率:它们有何不同? 代码覆盖率:指示通过用Selenium或...

  • 登录慕测平台从慕测开发者测试练习的Triangle和NextDay程序中分别生成满足100%语句覆盖、函数覆盖

    1.对Triangle进行JUnit测试并设计测试用例使其满足100%函数覆盖 2.对Triangle进行JUnit测试并设计测试用例使其满足100%语句覆盖 3.对Triangle进行JUnit测试并设计测试用例使其满足100%判定覆盖 4.对NextDay进行JUnit...

Global site tag (gtag.js) - Google Analytics